{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "bec70a3b-1f69-4554-bc48-85f43fd94c0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入必要的库\n",
    "import numpy as np\n",
    "from sklearn import datasets\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn_genetic import GASearchCV  # 从sklearn-genetic-opt导入遗传算法搜索\n",
    "from scipy.stats import uniform, randint\n",
    "from sklearn_genetic.space import Integer, Categorical, Continuous\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a26d5fc3-fb73-4a81-a618-f06aed4abc2a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. 加载鸢尾花数据集\n",
    "iris = datasets.load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "target_names = iris.target_names\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "cf996771-585e-4c85-97d2-9c2bf77923e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 2. 数据标准化（KNN对特征尺度敏感）\n",
    "scaler = StandardScaler()\n",
    "X_scaled = scaler.fit_transform(X)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "88641c20-6a1b-42d7-9938-dd25301c638d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 3. 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "97dbb8c5-e8e1-4b2e-8ff9-8407dcb07913",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4. 定义KNN模型\n",
    "knn = KNeighborsClassifier()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "31e531ea-a6e7-4666-bb11-d3bbd820eed5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 5. 设置参数搜索空间（使用遗传算法优化）\n",
    "param_grid = {\n",
    "    'n_neighbors': Integer(1, 20),           # K值\n",
    "    'weights': Categorical(['uniform', 'distance']),  # 权重计算方式\n",
    "    'p': Integer(1, 2),                     # 距离度量方式\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "eee20322-1a26-4522-99e5-fd68f30ffbbb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 6. 配置遗传算法搜索\n",
    "ga_search = GASearchCV(\n",
    "    estimator=knn,\n",
    "    cv=5,                  # 5折交叉验证\n",
    "    scoring='accuracy',     # 优化目标为准确率\n",
    "    population_size=30,     # 每代个体数\n",
    "    generations=50,         # 进化代数\n",
    "    tournament_size=3,      # 锦标赛选择的大小\n",
    "    elitism=True,           # 保留每代最优个体\n",
    "    param_grid=param_grid,\n",
    "    verbose=True,           # 打印进化过程\n",
    "    n_jobs=-1              # 使用所有CPU核心\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "c987411e-b8ef-437d-b174-b8238a10203a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gen\tnevals\tfitness \tfitness_std\tfitness_max\tfitness_min\n",
      "0  \t30    \t0.926667\t0.0137244  \t0.952381   \t0.895238   \n",
      "1  \t60    \t0.935873\t0.00734974 \t0.952381   \t0.914286   \n",
      "2  \t60    \t0.940317\t0.00598983 \t0.952381   \t0.933333   \n",
      "3  \t60    \t0.943175\t0.00520674 \t0.952381   \t0.933333   \n",
      "4  \t60    \t0.945079\t0.00402812 \t0.952381   \t0.942857   \n",
      "5  \t60    \t0.945714\t0.00500944 \t0.952381   \t0.933333   \n",
      "6  \t60    \t0.946032\t0.00863585 \t0.952381   \t0.92381    \n",
      "7  \t60    \t0.949206\t0.0066591  \t0.952381   \t0.92381    \n",
      "8  \t60    \t0.950794\t0.00699134 \t0.952381   \t0.914286   \n",
      "9  \t60    \t0.950794\t0.00606507 \t0.952381   \t0.92381    \n",
      "10 \t60    \t0.951111\t0.00475131 \t0.952381   \t0.933333   \n",
      "11 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n",
      "12 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "13 \t60    \t0.948889\t0.00833296 \t0.952381   \t0.92381    \n",
      "14 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n",
      "15 \t60    \t0.951111\t0.00475131 \t0.952381   \t0.933333   \n",
      "16 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "17 \t60    \t0.951111\t0.0068383  \t0.952381   \t0.914286   \n",
      "18 \t60    \t0.950159\t0.00681616 \t0.952381   \t0.92381    \n",
      "19 \t60    \t0.949841\t0.00775019 \t0.952381   \t0.92381    \n",
      "20 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n",
      "21 \t60    \t0.950476\t0.00571429 \t0.952381   \t0.933333   \n",
      "22 \t60    \t0.951111\t0.00475131 \t0.952381   \t0.933333   \n",
      "23 \t60    \t0.951111\t0.00475131 \t0.952381   \t0.933333   \n",
      "24 \t60    \t0.951111\t0.00475131 \t0.952381   \t0.933333   \n",
      "25 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n",
      "26 \t60    \t0.951429\t0.00512873 \t0.952381   \t0.92381    \n",
      "27 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "28 \t60    \t0.950794\t0.00606507 \t0.952381   \t0.92381    \n",
      "29 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n",
      "30 \t60    \t0.949206\t0.00863585 \t0.952381   \t0.914286   \n",
      "31 \t60    \t0.950476\t0.00712697 \t0.952381   \t0.92381    \n",
      "32 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "33 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n",
      "34 \t60    \t0.948254\t0.00840521 \t0.952381   \t0.92381    \n",
      "35 \t60    \t0.950476\t0.00622093 \t0.952381   \t0.92381    \n",
      "36 \t60    \t0.949841\t0.00692617 \t0.952381   \t0.92381    \n",
      "37 \t60    \t0.952063\t0.00170958 \t0.952381   \t0.942857   \n",
      "38 \t60    \t0.950794\t0.00496904 \t0.952381   \t0.933333   \n",
      "39 \t60    \t0.951429\t0.00376963 \t0.952381   \t0.933333   \n",
      "40 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "41 \t60    \t0.950476\t0.00712697 \t0.952381   \t0.92381    \n",
      "42 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n",
      "43 \t60    \t0.951429\t0.00376963 \t0.952381   \t0.933333   \n",
      "44 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "45 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "46 \t60    \t0.951111\t0.00475131 \t0.952381   \t0.933333   \n",
      "47 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "48 \t60    \t0.952381\t1.11022e-16\t0.952381   \t0.952381   \n",
      "49 \t60    \t0.950159\t0.00765204 \t0.952381   \t0.914286   \n",
      "50 \t60    \t0.951746\t0.00341915 \t0.952381   \t0.933333   \n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>GASearchCV(cv=5, estimator=KNeighborsClassifier(n_neighbors=7, p=1),\n",
       "           generations=50, n_jobs=-1,\n",
       "           param_grid={&#x27;n_neighbors&#x27;: &lt;sklearn_genetic.space.space.Integer object at 0x15dc18d70&gt;,\n",
       "                       &#x27;p&#x27;: &lt;sklearn_genetic.space.space.Integer object at 0x15c6b4aa0&gt;,\n",
       "                       &#x27;weights&#x27;: &lt;sklearn_genetic.space.space.Categorical object at 0x15dc18680&gt;},\n",
       "           population_size=30, return_train_score=True, scoring=&#x27;accuracy&#x27;,\n",
       "           warm_start_configs=[])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;GASearchCV<span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>GASearchCV(cv=5, estimator=KNeighborsClassifier(n_neighbors=7, p=1),\n",
       "           generations=50, n_jobs=-1,\n",
       "           param_grid={&#x27;n_neighbors&#x27;: &lt;sklearn_genetic.space.space.Integer object at 0x15dc18d70&gt;,\n",
       "                       &#x27;p&#x27;: &lt;sklearn_genetic.space.space.Integer object at 0x15c6b4aa0&gt;,\n",
       "                       &#x27;weights&#x27;: &lt;sklearn_genetic.space.space.Categorical object at 0x15dc18680&gt;},\n",
       "           population_size=30, return_train_score=True, scoring=&#x27;accuracy&#x27;,\n",
       "           warm_start_configs=[])</pre></div> </div></div><div class=\"sk-parallel\"><div class=\"sk-parallel-item\"><div class=\"sk-item\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">best_estimator_: KNeighborsClassifier</label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=7, p=1)</pre></div> </div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=7, p=1)</pre></div> </div></div></div></div></div></div></div></div></div>"
      ],
      "text/plain": [
       "GASearchCV(cv=5, estimator=KNeighborsClassifier(n_neighbors=7, p=1),\n",
       "           generations=50, n_jobs=-1,\n",
       "           param_grid={'n_neighbors': <sklearn_genetic.space.space.Integer object at 0x15dc18d70>,\n",
       "                       'p': <sklearn_genetic.space.space.Integer object at 0x15c6b4aa0>,\n",
       "                       'weights': <sklearn_genetic.space.space.Categorical object at 0x15dc18680>},\n",
       "           population_size=30, return_train_score=True, scoring='accuracy',\n",
       "           warm_start_configs=[])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 7. 执行遗传算法优化\n",
    "ga_search.fit(X_train, y_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "3dd84e24-ff2d-4dc5-bac4-589a07e746ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "最佳参数组合: {'n_neighbors': 7, 'weights': 'uniform', 'p': 1}\n",
      "最佳交叉验证准确率: 0.9523809523809523\n"
     ]
    }
   ],
   "source": [
    "# 8. 输出最佳参数\n",
    "print(\"\\n最佳参数组合:\", ga_search.best_params_)\n",
    "print(\"最佳交叉验证准确率:\", ga_search.best_score_)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "202b0bae-fd51-4646-adc8-bd083c43d5af",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "测试集分类报告:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "      setosa       1.00      1.00      1.00        19\n",
      "  versicolor       1.00      1.00      1.00        13\n",
      "   virginica       1.00      1.00      1.00        13\n",
      "\n",
      "    accuracy                           1.00        45\n",
      "   macro avg       1.00      1.00      1.00        45\n",
      "weighted avg       1.00      1.00      1.00        45\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 9. 在测试集上评估\n",
    "best_knn = ga_search.best_estimator_\n",
    "y_pred = best_knn.predict(X_test)\n",
    "print(\"\\n测试集分类报告:\")\n",
    "print(classification_report(y_test, y_pred, target_names=target_names))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "741db320-b733-4bf2-85b6-c5f71fd8966c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Azz77LPl9j158iSGDBmCuLg4FBcXY926dYiJicHcuXMBAP369cPq1asRHx8PuVyOVatWITU1FePGjYOzszN27NiBlStXori4GBkZGVi6dClGjx4Nb2/vOn7VdY/FMIiIiIiI6p5Jy7vv3r0b2dnZcHV1Re/evTFu3DisXLkSgKa36eeffwYATJs2DQsXLsSAAQPg5OSEwMBABAUFwcXFBQDw8ccfY+TIkejXrx9atGiBs2fP4ujRo2jXrh0sLCwQFBSEyMhItGjRAn5+fmjRokWlQw4bE0EQyqyjRUREREREdcNkQwcBwN3dHYGBgRXel5+fX+b26tWrKyxSAWiqDm7YsAEbNmyo8P4uXbrg0KFDtWtsA5RbrESJUlMQhD1aRERERER1x6Q9WmRc2mGDdpZmsJRKqtibiIiIiIgMhUGrEeP8LCIiIiIi02DQasQ4P4uIiIiIyDQYtBox9mgREREREZkGg1YjxqBFRERERGQaDFqNGIMWEREREZFpMGg1YpyjRURERERkGgxajRh7tIiIiIiITINBqxFj0CIiIiIiMg0GrUZKpRaQWcCgRURERERkCgxajVRGgRxqARCLACcbBi0iIiIiorrEoNVIaYcNOtpYQCIWmbg1RERERERNC4NWI8X5WUREREREpsOg1UgxaBERERERmQ6DViPFNbSIiIiIiEyHQauRYo8WEREREZHpMGg1UgxaRERERESmw6DVSDFoERERERGZDoNWI8U5WkREREREpsOg1UixR4uIiIiIyHQYtBqhYoUKecVKAAxaRERERESmwKDVCGl7s8zNxLC3NDNxa4iIiIiImh4GrUbowflZIpHIxK0hIiIiImp6GLQaIc7PIiIiIiIyLQatRohBi4iIiIjItBi0GiEGLSIiIiIi02LQaoS4hhYRERERkWkxaDVC7NEiIiIiIjItBq1GiEGLiIiIiMi0GLQaIQYtIiIiIiLTYtBqZARB4BwtIiIiIiITY9BqZHKLlShRqgGwR4uIiIiIyFQYtBoZ7bBBO0szWEolJm4NEREREVHTxKDVyHB+FhERERGR6TFoNTKcn0VEREREZHoMWo0Me7SIiIiIiEyPQauRYdAiIiIiIjI9Bq1GhkGLiIiIiMj0GLQaGc7RIiIiIiIyPQatRoY9WkREREREpseg1cgwaBERERERmR6DViOiUgvILGDQIiIi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7m7nGmO0YcMG1dfXa8mSJfrZz34mr9erkpISSVJeXp5OnjwZdA0AAOsiaAEAbC8iIkJ33XWXTp06FfS1lZWVysvLU2Njo1599VVNnDjxmq7bunWrBgwYIEmKiYmRz+dTVVWV5s2bp4KCgi7nGmP03nvv6Y477lBLS4tqamo0efJkvf3225KkY8eOyel0Bl07AMC6CFoAANvLz8/X3XffraVLlwZ97caNG/XlL39ZvXv37nasra1NmzZtkt/v7zb+85//XA8++KAkyel0qrGxUVlZWdq3b5+Kioq0Y8eOwPmVlZWaPHmycnJy9K9//UsffvihsrKydOedd+rUqVNqbm5WcnJy0LUDAKyLoAUA+FT40Y9+pNTUVM2cOVMOh0MnTpzQqFGjAp/ffPPNcrvdXa6prq7Wc88912NAM8boW9/6ljZs2NAtaL300kvyer26++67JUmJiYn697//LUn63Oc+py1btigzMzNwfmlpqQoKCrR9+3bt27dPe/bs0fvvv69169bp9ddfl8/nU0REhBwOhxwOh+bPnx/qlwcA8P+MoAUA+FRIS0vTxo0btWPHDhljNHjwYJWVlQU+f+edd3TmzJku16xYsUJJSUm65ZZbuoy3trbqG9/4hv70pz/pd7/7XZfZrqamJn3ve99Tenq6IiIi9OGHH6qmpkbV1dXasmWLioqK9Oabb6qwsDBw79f8+fO1dOlSZWVlae7cufrSl76kpqYmbdiwQfv371deXp6MMSotLVVeXp42bdr0yb9gAIBPFEELAGBr27ZtU58+feRyuXTnnXde83W/+MUv9Ktf/UoREV1/FNbU1GjSpEk6deqUDh482G1J32OPPSav1ytJKioqUmpqqubNm6eWlhatX79eR44cUVtbm2666SYlJiZKkg4ePKiNGzdq27ZtkqSMjAz9+Mc/1ksvvaRdu3apqqpKUse9Wjk5Of/tSwEAsBCCFgDA1u655x7V19dr586damtrCyy/62npoMPh0E9+8hP95S9/0cMPP6ynn3662/NVVlbqi1/8onbt2qWkpKQux3bs2KEXXnhB69atkyQtXbpUPp9P586dU2pqqtasWaOtW7eqqKhIK1eu1KBBgyRJEyZM0BtvvKGKigq9/fbbmjVrlu644w6VlZVp1qxZGjx4sN5//3397W9/04gRIz75Fw0A8IkjaAEAPlWMMTLGKDk5WZWVlV2WDhpj9J3vfEejR49WeXm58vLyul2fm5urlStXKjIystux8ePHa9euXRo6dKgkqVevXoqNjZUk3XTTTfrjH/94xdreeustTZo0KXCv2O23366VK1dqzJgx2r59u37/+99r3Lhx1/sSAAAsgKAFAPjUKSsrU0tLS7fNLy6VkZFxTc/V2tqq3/72t2pvb1dSUpJuu+22Hs+bOnVql50GL7V27Vo5HA794Ac/0NNPPx2YdfvHP/6h7OxszZw5U8XFxerVq5duvPHGa6oLAGBtBC0AwKfCgQMH5PF4dO7cOc2fP19PPPGEoqOjr/t5P/jgA82ePVvGmCued9999+nYsWOB98by+XyB4LV27Vo999xzysnJUWNjo9avX6+JEydq8+bNkqSxY8eqsbFRU6dOve56AQDWQNACANhecXGxdu/erQULFigvL0/Lly/XN7/5zcDxDRs26LOf/aza29t1/vz5yz5PZGSk6urq1NzcHBh7+eWXNWLEiB6XEl4qLS1NS5cu1Q9/+ENJ0vHjx7Vs2bLAcbfbrWHDhmnQoEF65JFH9N3vfjdwrKioSNHR0dq8eXNgp0IAgL1FhbsAAACux09/+lP9+te/1quvvqqUlBRlZ2ersLBQy5YtU2RkpKKiotTW1iafzyefz6fPf/7zeu2113p8rtGjR8vv9ysuLi4w5nK5VFJSck21PPHEE5oyZYpWr16ttra2wPtsGWPkdrvVu3dvRUdHa9SoUVq8eLF27dql9evXa+vWrdq7d6/27NmjSZMm6ZVXXtHtt99+/S8OACBsCFoAAFtbtGiRFi5cGHivqxkzZmjGjBn/1XP169dPx48fV0tLi9rb2yVJsbGxcjgc13S90+nU7t279eijj6q0tFRbt26VJK1Zs0YlJSWaN2+e/v73vys+Pl6vvPKKCgsLdfr0aR05ckRut1s33nijXC6XXnzxRYIWANicw1xt0TkAALgura2tiorq/rvNlpYWxcTEhKEiAMAnjaAFAAAAACHGZhgAAAAAEGIELQAAAAAIMYIWAAAAAIQYQQsAAAAAQoygBQAAAAAhRtACAAAAgBAjaAEAAABAiBG0AAAAACDECFoAAAAAEGIELQAAAAAIsf8D2QOY8SnSI+AAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 10. 可视化进化过程（可选）\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # macOS 系统\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.plot(ga_search.history['fitness'], label='最佳适应度')\n",
    "# plt.plot(ga_search.history['fitness_avg'], label='平均适应度')\n",
    "plt.xlabel('进化代数')\n",
    "plt.ylabel('准确率')\n",
    "plt.title('遗传算法优化过程')\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "151cf38d-3b8f-46bd-bee5-72deab558021",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
